
#include <linux/fs.h>
#include <linux/gfp.h>
#include <linux/io.h>
#include <linux/miscdevice.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/types.h>
#include <linux/uaccess.h>
#include <linux/watchdog.h>
#include <linux/of.h>


#include <linux/module.h>
#include <linux/delay.h>
/* register offsets */
#define	LS_WDT_EN		0x30
#define	LS_WDT_EN_ENABLE	(1 << 1)
#define LS_WDT_SET		0x34
#define	LS_WDT_TIMER		0x38


#define	WDT_STATE_STOP	0
#define	WDT_STATE_START	1

#define WDT_FREQ 120*1000*1000 // 120MHz
#define WDT_BASE 0x1fe07000

// #define REG_BASE 0x900000001fe105100
#define REG_BASE 0x1fe10500
struct reg_gpio
{
    uint32_t GPIO0_OEN_L;   uint32_t GPIO0_OEN_H;
    uint32_t GPIO1_OEN_L;   uint32_t GPIO1_OEN_H;

    uint32_t GPIO0_O_L;     uint32_t GPIO0_O_H;
    uint32_t GPIO1_O_L;     uint32_t GPIO1_O_H;

    uint32_t GPIO0_I_L;     uint32_t GPIO0_I_H;
    uint32_t GPIO1_I_L;     uint32_t GPIO1_I_H;

    uint32_t GPIO0_INTEN_L; uint32_t GPIO0_INTEN_H;
    uint32_t GPIO1_INTEN_L; uint32_t GPIO1_INTEN_H;

};


// static void ls_wdt_start(struct ls_wdt *wdt)
// {
// 	unsigned long flags;

// 	ls_wdt_start_locked(wdt);
// }

void open()
{
    u32 ctrl;
    uint64_t *paddr;
    paddr = ioremap(WDT_BASE, 0x38+4);
    writel(15*WDT_FREQ, paddr + LS_WDT_TIMER);
	writel(2, paddr + LS_WDT_EN);
	writel(1, paddr + LS_WDT_SET);

    ctrl = readl(paddr + LS_WDT_EN);
	ctrl |= LS_WDT_EN_ENABLE;
	writel(ctrl, paddr + LS_WDT_EN);
	writel(1, paddr + LS_WDT_SET);
    // mdelay(4*1000);

    // writel(20*WDT_FREQ, paddr + LS_WDT_TIMER);
	// writel(1, paddr + LS_WDT_SET);
}
static int __init ls2k_gpio_init(void)
{
    uint64_t *paddr;
    uint64_t val;
    struct reg_gpio *reg;

    // __asm__();

    open();

    return 0;
}

static void __exit ls2k_gpio_exit(void)
{

}



module_init(ls2k_gpio_init);
module_exit(ls2k_gpio_exit);
